import logging
import os
from flask import Flask, jsonify, request
from models.user_models import User
from sqlalchemy import text
from extensions import db, socketio, cors, jwt
from models.user_models import User

from config import Config
from logging_config import logger 

# 先加载.env文件（确保环境变量优先）
from dotenv import load_dotenv
load_dotenv()  # 加载项目根目录下的.env文件


# 初始化日志系统
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("app.log", encoding="utf-8"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger("chat_app")

# 打印环境变量（调试用，生产环境可移除）
logger.info("===== 环境变量加载状态 =====")
for k, v in os.environ.items():
    if k.startswith(('APP_', 'DATABASE_', 'JWT_')):
        logger.info(f"{k}: {v if len(v) < 50 else v[:50] + '...'}")
logger.info("=========================")

# 初始化扩展（避免循环依赖）
from extensions import db
from extensions import socketio, cors, jwt

def create_app(config_name=None):
    """应用工厂函数，创建并配置Flask应用"""
    app = Flask(__name__)
    
    # 确定配置环境（优先使用环境变量，默认开发环境）
    if config_name is None:
        config_name = os.environ.get('APP_ENV', 'development')
    logger.info(f"使用配置: {config_name}Config")
    
    # 加载配置类
    from config.development import DevelopmentConfig
    config_class = DevelopmentConfig()
    app.config.from_object(config_class)
    app.config['SQLALCHEMY_ECHO'] = True
    
    # 初始化扩展
    db.init_app(app)
    # 使用环境变量中的CORS配置，确保与Nginx反向代理兼容
    cors_origins = app.config.get('CORS_ALLOWED_ORIGINS', '*')
    # 检查cors_origins类型，如果是字符串则split，否则直接使用
    if isinstance(cors_origins, str):
        cors_origins = cors_origins.split(',')
    
    socketio.init_app(
        app,
        cors_allowed_origins=cors_origins,
        async_mode=app.config.get('SOCKETIO_ASYNC_MODE', 'threading')
    )
    jwt.init_app(app)
    cors.init_app(app, resources={
        r"/*": {
            "origins": app.config.get('CORS_ALLOWED_ORIGINS', '*'),
            "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
            "allow_headers": ["Content-Type", "Authorization", "X-Requested-With"],
            "supports_credentials": True
        }
    })
    
    # 初始化JWT扩展


    logger.info("JWT扩展初始化完成")
    from utils.auth import get_redis_client
    redis_client = get_redis_client(app)
    app.redis_client = redis_client
    
    # 延迟导入蓝图（解决模块未加载问题）
    from api.auth import auth_bp
    from api.messages import messages_bp
    from api.users import users_bp
    from api.law_enforcement import law_enforcement_bp
    from api.contacts import contacts_bp
    
    # 注册蓝图
    app.register_blueprint(auth_bp, url_prefix='/api/auth')
    app.register_blueprint(messages_bp, url_prefix='/api/messages')
    app.register_blueprint(users_bp, url_prefix='/api/users')
    app.register_blueprint(law_enforcement_bp, url_prefix='/api/law')
    app.register_blueprint(contacts_bp)
    
    # JWT令牌验证工具（假设utils.auth存在此函数）
    from utils.auth import validate_jwt, get_current_user
    app.verify_jwt_token = validate_jwt
    app.get_current_user_id = lambda: str(get_current_user().id) if get_current_user() else None
    
    # 统一异常处理
    from utils.errors import register_error_handlers
    register_error_handlers(app)
    
    # 静态文件路由
    @app.route('/')
    def index():
        return app.send_static_file('index.html')
    
    @app.route('/test_crypto.html')
    def test_crypto():
        return app.send_static_file('test_crypto.html')
    
    @app.route('/register.html')
    def register():
        return app.send_static_file('register.html')
    
    @app.route('/index.html')
    def index_html():
        return app.send_static_file('index.html')
    
    @app.route('/welcome.html')
    def welcome():
        return app.send_static_file('welcome.html')
    
    @app.route('/loading.html')
    def loading():
        return app.send_static_file('loading.html')
    
    # WebSocket事件处理
    import socket_handlers  # 导入WebSocket处理器
    return app

# 创建应用实例
app = create_app()

if __name__ == '__main__':
    # 开发环境数据库初始化
    if app.config.get('DEBUG'):
        with app.app_context():
            try:
                # 导入核心模型
                from models.user_models import User
                from models.message_models import Message
                from models.decryption_log import DecryptionLog
                from models.auth_log import AuthLog
                from models import db
                
                # 检查数据库是否为空，如果是则创建表
                try:
                    # 先尝试创建表，如果已存在则跳过
                    db.create_all()
                    logger.info("数据库表已创建或已存在")
                    
                    # 检查是否有用户数据
                    user_count = User.query.count()
                    if user_count == 0:
                        logger.info("数据库为空，建议运行create_all_users.py创建测试用户")
                    else:
                        logger.info(f"数据库已有{user_count}个用户")
                        
                except Exception as e:
                    logger.error(f"数据库初始化错误: {e}")
                    
            except ImportError as e:
                logger.error(f"模型导入失败: {e}，请检查models目录结构")
    
    # 启动应用 - 在Docker环境中需要监听0.0.0.0以允许其他容器访问
    socketio.run(
        app,
        debug=app.config.get('DEBUG'),
        host='0.0.0.0',
        port=app.config.get('PORT', 5000),
        ssl_context=app.config.get('SSL_CONTEXT'),
        allow_unsafe_werkzeug=app.config.get('DEBUG')
    )